package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

/*
绝大多数请求失败的情况下，resp 的值为 nil 且 err 为 non-nil。但如果你得到的是重定向错误，那它俩的值都是 non-nil，最后依旧可能发生内存泄露。2 个解决办法：

可以直接在处理 HTTP 响应错误的代码块中，直接关闭非 nil 的响应体。
手动调用 defer 来关闭响应体：
*/
func checkError(err error) {
	if err != nil {
		log.Fatalln(err)
	}
}

// 正确示例
func main() {
	resp, err := http.Get("http://www.baidu.com")

	// 关闭 resp.Body 的正确姿势
	if resp != nil {
		defer resp.Body.Close()
	}

	checkError(err)
	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	//如果程序大量重用 HTTP 长连接，你可能要在处理响应的逻辑代码中加入
	//_, err = io.Copy(ioutil.Discard, resp.Body) // 手动丢弃读取完毕的数据
	checkError(err)

	fmt.Println(string(body))
}
